iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Software Development

用作業系統讀懂另一半的OS系列 第 4

【2025鐵人賽】用作業系統讀懂另一半的OS:Overview 03

  • 分享至 

  • xImage
  •  

雙模式(Dual-Mode)

Dual-Mode是OS的一種設計。平時OS就是在掌控我們電腦裡面的殺生大權,要是哪天惹OS不開心,他把我的D巢(對我故意打這個巢),還有那些見不得人的東西發出去,或是把它銷毀,是不是令人冷汗的一件事呢(XXX

作業系統不是誰都可以亂動的(就像身體依樣,每個人都要保護好自己)

為了防止OS被惡意或寫壞的程式所gank,OS採Dual-Mode的安全機制,白話說就是:「安全的操作可以由使用者操作,但對於危險的操作只能由 OS 核心來做」。Dual-Mode可以分為:

  • User mode(使用者模式):執行使用者程式,受限、無法執行危險指令
  • Kernel mode(核心模式):執行作業系統程式,有最高權限,可直接操控硬體

https://ithelp.ithome.com.tw/upload/images/20250723/20177764OBXlJKPGzg.png

雙模式(Dual-Mode)最主要的核心是「只有作業系統可以從 User Mode 進入 Kernel Mode,且必須透過中斷機制或系統呼叫」。至於兩種模式之間的切換,大概有這幾種:

  • 使用者執行自己的應用程式 → 隸屬User Mode
  • 當操作需要系統幫忙(例如 read()),就會發出System Call
  • CPU 進入 Kernel Mode,由 OS 幫你做這些「高危操作」
  • 執行完後,切回 User Mode 繼續

接下來剩下一些小知識,雖然會有點突兀,但這邊就把它應塞進來XD

計時器(Timer)

在OS當中,並不是每一樣程序燈可以如期完成,程序可能會有

  • 一直跑無限迴圈
  • 佔用 CPU 太久,不讓其他程式上場
  • 搶著吃資源,別人都不能用

在這樣的前提下,OS就有Timer。負責定時中斷,強迫程式交出 CPU 控制權,目的是避免程式無限迴圈或長時間佔用 CPU。

Timer就像是在提想你,不要強求,給自己留些處理空間。讓你有機會切換到更值得的過程。

開機流程(Bootstrap Process)

電腦開機時,會執行bootstrap program(啟動程式),bootstrap program裡面儲存著firmware,主要負責初始化 CPU、記憶體與裝置控制器,然後載入kernel。kernel執行後,會載入系統程式(稱為 daemon,常駐程式),例如Linux 中第一個系統程式是 systemd。系統完成開機後,就等待「事件」(例如:鍵盤輸入、網路請求)。

總之,這邊一共會有兩個重點。第一個重點是電腦開機後的bootstrap program。bootstrap program包含:

  • 初始化 CPU(讓它有邏輯能思考)
  • 設定記憶體
  • 啟動裝置控制器(像硬碟、滑鼠、螢幕)
  • (最重要)把作業系統(Kernel)從硬碟載入記憶體中

然後由 Kernel 正式接手,開始管理整台系統。而當 Kernel 成功載入後,它會開始做:

  • 啟動系統背景程式(稱為 daemon,意思是常駐服務)(例如 Linux 系統中最早啟動的是 systemd)
  • 設定好網路、檔案系統、使用者管理等
  • 載入登入介面、桌面環境
  • 最後,系統進入等待事件(event-driven)模式(等待user開始下指令)

https://ithelp.ithome.com.tw/upload/images/20250726/20177764e64WjJ0pfS.png

Linker & Loader

當我們寫好一支程式後,(例如 main.c)你不能直接執行它。它必須經過以下流程:
第一,編譯器(Compiler):負責將 .c 原始程式碼編譯成 物件檔(Object File),也就是 .o 檔案。這個階段只處理單一原始檔,還不能執行。

第二,連結器(Linker):將多個物件檔和函式庫合併成最終的 可執行檔(Executable File),也就是 .exe(Windows)或無副檔名的執行檔(Linux)。連結器有兩種方式:

  • 靜態連結(Static Linking):把函式庫內容直接寫進執行檔中,執行時不再需要外部函式庫。檔案較大,但獨立性高。
  • 動態連結(Dynamic Linking):不直接寫入內容,只留下「之後再載入」的資訊。等程式真的執行時,才載入對應的共享函式庫(例如 .dll 或 .so)。檔案小,但執行時需要依賴外部函式庫。

第三,載入器(Loader):作業系統的元件,負責將程式載入記憶體、配置資源,準備執行。此階段會進行:

  • 呼叫 fork():建立一個新的行程(process)
  • 呼叫 exec():將 main 程式碼載入該行程的記憶體中,開始執行主程式

https://ithelp.ithome.com.tw/upload/images/20250723/20177764ZdBrILtvgq.png

I/O Systems Overview

那那那,我再把I/O Systems的東西,再這邊多做個補充,快寫完了(((

其實鍵盤,滑鼠,喇叭這類電腦周邊裝智是超級難搞的。因為每個周邊裝置都有自己對應的操作功能跟需求。但總不能叫每個開發者都懂每個裝置的通訊協定吧。因此這邊提出的解法是,OS扮演「中介」的角色。統一管理五花八門的裝置,讓開發者可以統一用read()、write() 這種簡單方法就搞定。

當前在I/O技術的兩大趨勢(彼此衝突,但也並存):

  • 標準化(Standardization):裝置介面越來越統一,讓驅動程式能通用。
  • 多樣化(Diversification):裝置越來越奇怪,每個都想有自己的通訊方式。

而OS的挑戰就在於:在統一的管理架構中處理日益複雜的多樣裝置。OS會透過一些實體路線傳訊號跟I/O傳輸,例如:

  • Port:早期的 I/O 通訊線(例如印表機的 LPT1)
  • Bus(匯流排):像資料的高速公路,常見如 PCIe、SATA、USB

Memory-Mapped I/O

而為了讓CPU跟I/O5裝置交互更方便,有一種設計較Memory-Mapped I/O,也就是把裝置「偽裝成」記憶體的一部分。舉例來說:

  • CPU 想要「檢查硬碟狀態」,就去讀某個記憶體位置(其實是對映到裝置的 status 暫存器)
  • 要寫入資料到音效卡:就對某個記憶體地址「寫入資料」,裝置就會讀到。

透過這樣的方式,CPU 就可以用一般 mov 或 ld/st 指令來控制裝置,不需要額外的 I/O 指令集。

https://ithelp.ithome.com.tw/upload/images/20250723/201777649Hd02PIyMF.png

耶~~這個章節結束了,明天就可以進到新的章節:Process搂


上一篇
【2025鐵人賽】用作業系統讀懂另一半的OS:Overview 02
下一篇
【2025鐵人賽】用作業系統讀懂另一半的OS:Process 01
系列文
用作業系統讀懂另一半的OS30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言